from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.rol import metadata, Rol
from models.database import db_session
import sys
#import bz2

from models.rolManager import RolManager
from models.faseManager import FaseManager
from models.proyectoManager import ProyectoManager
from models.permisoManager import PermisoManager
from models.comiteManager import ComiteManager
from models.usuarioManager import UsuarioManager


permisoMgr = PermisoManager()
proyectoMgr = ProyectoManager()
comiteMgr = ComiteManager()
usuarioMgr = UsuarioManager()

"""
Clase que contiene los metodos relacionados con la gestion de comites
"""

def amComite():
    """ Metodo encargado de la gestion del comite de un proyecto """
    filtro=""
    if request.method == "POST":
        if request.form["operacion"] != "":
            operacion = request.form["operacion"]
            idproyecto = session['idproyecto'] 
            return redirect(url_for(operacion, idproyecto=idproyecto)) 
        else:
            idproyecto = request.form["idproyecto"]
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return render_template("amComite.html", proyecto= proyecto, idproyecto=idproyecto)
    if request.method == "GET":
        if request.args.getlist("operacion"):
            return redirect(url_for("amComite", method='POST', operacion=operacion, idproyecto=request.args.getlist("idproyecto")[0]))

        if session['idproyecto']: 
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return render_template("amComite.html", proyecto= proyecto, idproyecto=idproyecto)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action="amComite"))
        
def agregarIntegrante():
    """Metodo encargado de agregar integrantes al comite del proyecto"""
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        if request.form.getlist("check"):
            idintegrantes = request.form.getlist("check")
            integrantes = []
            for i in xrange(0, len(idintegrantes)):
                integrante = usuarioMgr.getUsuario(idintegrantes[i])
                integrantes.append(integrante)
            comite = proyectoMgr.getComiteDelProyecto(idproyecto)
            comite.usuarios = integrantes
            comiteMgr.guardarComite(comite)
            return redirect(url_for("amComite", idproyecto=idproyecto))
        else:
            usuarios = proyectoMgr.getUsuariosDelProyecto(idproyecto)
            comite = proyectoMgr.getComiteDelProyecto(idproyecto)
            return render_template("agregarIntegrante.html", usuarios = usuarios, comite = comite, form = request.form)
    else:
        
        pagina=1
        if request.args.getlist("pagina"):
            pagina=request.args.getlist("pagina")[0]
        
        idproyecto = request.args.getlist("idproyecto")[0]
        return paginarAgregarIntegrante(idproyecto, pagina, "")

def modificarIntegrante():
    session = db_session()
    """Metodo encargado de modificar un integrante del comite del proyecto"""
    
    if request.method == "GET":
        pagina=1
        if request.args.getlist("pagina"):
            pagina=request.args.getlist("pagina")[0]
        
        idproyecto = request.args.getlist("idproyecto")[0]
        return paginarModificarIntegrante(idproyecto, pagina, "")
    
    
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        if request.form.getlist("check"):
            idintegrantes = request.form.getlist("check")
            integrantes = []
            for i in xrange(0, len(idintegrantes)):
                integrante = usuarioMgr.getUsuario(idintegrantes[i])
                integrantes.append(integrante)
            comite = proyectoMgr.getComiteDelProyecto(idproyecto)
            comite.usuarios = integrantes
            comiteMgr.guardarComite(comite)
            return redirect(url_for("amComite", idproyecto=idproyecto))
        else:
            return paginarModificarIntegrante(idproyecto, 1, "")

        mensajes = get_flashed_messages(with_categories= True)
        categoria, mensaje = mensajes[0]
        if categoria == "error":
            flash(mensaje, categoria)
        else:
            flash("Modificado exitosamente");
        return redirect(url_for("amComite", idproyecto=idproyecto))

def paginarModificarIntegrante(idproyecto, pagina, filtro):
    """ Metodo encargado de la busqueda de usuarios integrantes de un comite a partir de un filtro """
    porPagina= 100
    pagina = int(pagina)
    total = usuarioMgr.getUsuariosPorProyectoPaginado(idproyecto, "", desde=None, hasta=None)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    comite = proyectoMgr.getComiteDelProyecto(idproyecto)
    lider = proyectoMgr.getProyecto(idproyecto).lider
    usuariosComite= usuarioMgr.getUsuariosPorComite(comite.idcomite)
    usuarios = usuarioMgr.getUsuariosPorProyectoPaginado(idproyecto, "", desde, hasta)
    for user in usuariosComite:
        if user in usuarios:
            usuarios.remove(user)
#     usuarios = usuarioMgr.getUsuariosPaginado(filtro, desde, hasta)
    return render_template("modificarIntegrante.html", idlider=lider.idusuario,\
        usuariosComite=usuariosComite, lista = usuarios, idproyecto= idproyecto, comite=comite,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina)
        
     
